<?php
/**
 * 基础物料数据验证Lib类
 * 
 * @access public
 * @author wangbiao<wangbiao@shopex.cn>
 * @version $Id: check.php 2016-08-03 15:00
 */
class material_basic_check
{
    /**
     * 数据检验有效性
     * 
     * @param  Array   $params
     * @param  String  $err_msg
     * @return Boolean
     */
    public function checkParams(&$params, &$err_msg)
    {
        $basicMaterialObj = app::get('material')->model('basic_material');
        
        //新增标记
        $is_new_add    = $params['edit'] ? false : true;
        unset($params['edit']);
        
        //检查物料名称
        if(empty($params['material_name'])){
            $err_msg    ="物料名称不能为空";
            return false;
        }
        
        if(empty($params['material_bn'])){
            $err_msg    = "物料编号不能为空";
            return false;
        }
        
        //检查有效性
        if($is_new_add)
        {
            //判断物料编码和物料条码只能是由数字英文下划线组成
            $reg_bn_code = "/^[0-9a-zA-Z\_\-]*$/";
            if(!preg_match($reg_bn_code,$params["material_bn"])){
                $err_msg = "物料编码只能是数字英文下划线组成";
                return false;
            }
            if(!preg_match($reg_bn_code,$params["material_code"])){
                $err_msg = "物料条码只能是数字英文下划线组成";
                return false;
            }
            
            $basicMaterialInfo = $basicMaterialObj->getList('material_bn',array('material_bn'=>$params['material_bn']));
            if($basicMaterialInfo){
                $err_msg ="当前新增的物料编码已存在，不能重复创建";
                return false;
            }
            
            //检查物料条码
            $barcode = app::get('material')->model('barcode')->getList('bm_id',array('code'=>$params['material_code'], 'type' => material_codebase::getBarcodeType()));
            if($barcode){
                $err_msg ="物料条码:". $params['material_code'] ." 已被使用，不能重复使用";
                return false;
            }
            
            $params['material_bn_crc32'] = sprintf('%u',crc32($params['material_bn']));
        }
        else 
        {
            if(empty($params['bm_id'])){
                $err_msg ="基础物料bm_id不能为空";
                return false;
            }
            
            $basicMaterialExistInfo = $basicMaterialObj->getList('bm_id',array('material_bn'=>$params['material_bn'], 'bm_id'=>$params['bm_id']));
            if(empty($basicMaterialExistInfo[0])){
                $err_msg ="提交的物料编码与物料ID不匹配,请检查";
                return false;
            }
        }
        
        if($params['type'] == 2){
            if(!isset($params['at'])){
                $err_msg ="组合物料请至少设置一个物料明细内容";
                return false;
            }
        
            foreach ($params['at'] as $val){
                if (count($params['at']) == 1){
                    if ($val <2){
                        $err_msg ="只有一种物料时，数量必须大于1";
                        return false;
                    }
                }else {
                    if ($val < 1){
                        $err_msg ="数量必须大于0";
                        return false;
                    }
                }
            }
        }
        
        #检验保质期监控配置
        $use_expire    = intval($params['use_expire']);
        $warn_day      = intval($params['warn_day']);
        $quit_day      = intval($params['quit_day']);
        if($use_expire == 1 && ($warn_day <= $quit_day))
        {
            $err_msg = "预警天数必须大于自动退出库存天数";
            return false;
        }
        
        #特殊扫码验证
        if($params['special_setting'] == '3')
        {
            if(!is_numeric($params['first_num']) || !is_numeric($params['last_num']))
            {
                $err_msg = "必须输入数字";
                return false;
            }
            
            #条码的后一个数必须大于前一个
            if($params['last_num'] - $params['first_num'] <= 0)
            {
                $err_msg = "读取的条码字符顺序错误，前一个框数字必须小于后一个框";
                return false;
            }
            
            #扫码的位数长度要等于输入的条码长度
            $code_len = strlen($params['material_code']);
            $scan_len = $params['last_num'] - $params['first_num'] + 1;
            if($code_len - $scan_len != 0)
            {
                $err_msg = "条码长度与扫码配置长度不相等";
                return false;
            }
        }
        
        return true;
    }

    /**
     * 检查基础物料个别参数是否可编辑
     *
     * @param Int $bm_id
     * @return Array
     */
    function checkEditReadOnly($bm_id){
        $readonly = array('type' => false);

        //如果基础物料有库存、冻结、采购、订单，那么物料类型不能变
        $basicMStockObj = app::get('material')->model('basic_material_stock');
        $storeInfo = $basicMStockObj->getList('store,store_freeze',array('bm_id'=>$bm_id));
        if($storeInfo[0]['store'] > 0 || $storeInfo[0]['store_freeze'] > 0){
            $is_type_readonly = true;
        }

        $purchaseItemObj = app::get('purchase')->model('po_items');
        $purchaseInfo = $purchaseItemObj->getList('product_id',array('product_id'=>$bm_id));
        if($purchaseInfo){
            $is_type_readonly = true;
            $is_use_expire_readonly = true;
        }

        $orderItemObj = app::get('ome')->model('order_items');
        $orderInfo = $orderItemObj->getList('product_id',array('product_id'=>$bm_id));
        if($orderInfo){
            $is_type_readonly = true;
        }

        //如果有批次明细就不能变更保质期的开关
        $basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
        $expireItemsInfo = $basicMaterialStorageLifeObj->getList('bm_id',array('bm_id'=>$bm_id));
        if($expireItemsInfo){
            $is_use_expire_readonly = true;
        }

        //类目绑定后什么情况下可以解绑换成别的?需要判断么?

        if($is_type_readonly){
            $readonly['type'] = true;
        }

        if($is_use_expire_readonly){
            $readonly['use_expire'] = true;
        }

        return $readonly;
    }

}